//
// Created by denglibin on 19-5-7.
//
#include "buffer_obj.h"

/**
 * 创建顶点缓冲对象
 * @param vertices 顶点数组
 * @param size 数组大小 (字节)
 * @return 对象id
 */
int createVBO(float vertices[], int size){
    unsigned int VBO; //顶点缓冲对象id
    glGenBuffers(1, &VBO); //创建一个缓冲对象,把id设置到VBO中
    //顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER,使用glBindBuffer函数把新创建的缓冲绑定到GL_ARRAY_BUFFER目标上
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    /**
glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数。

第一个参数是目标缓冲的类型：顶点缓冲对象当前绑定到GL_ARRAY_BUFFER目标上。
第二个参数指定传输数据的大小(以字节为单位)；用一个简单的sizeof计算出顶点数据大小就行。
第三个参数是我们希望发送的实际数据。
第四个参数指定了我们希望显卡如何管理给定的数据。它有三种形式：
GL_STATIC_DRAW ：数据不会或几乎不会改变。
GL_DYNAMIC_DRAW：数据会被改变很多。
GL_STREAM_DRAW ：数据每次绘制时都会改变。
三角形的位置数据不会改变，每次渲染调用时都保持原样，所以它的使用类型最好是GL_STATIC_DRAW。如果，比如说一个缓冲中的数据将频繁被改变，那么使用的类型就是GL_DYNAMIC_DRAW或GL_STREAM_DRAW，这样就能确保显卡把数据放在能够高速写入的内存部分。
现在我们已经把顶点数据储存在显卡的内存中，用VBO这个顶点缓冲对象管理
 */
    glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_STATIC_DRAW);
    return VBO;
}

/**
 * 创建索引缓冲对象
 * @param indices 索引数组
 * @param size 数组大小 (字节)
 * @return
 */
int createEBO(unsigned int indices[], int size){
    unsigned int  EBO; //索引缓冲对象id
    glGenBuffers(1, &EBO); //创建一个缓冲对象,把id设置到EBO中

    //绑定顶点索引数据到缓冲区对象
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); //索引缓冲对象
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, indices, GL_STATIC_DRAW);
    return EBO;
}